#include <iostream>
#include <string.h>
using namespace std;

//使用模板类来编写自己的栈，使用模板类为的是可以储存各种类型的数据而不是只有一种
//要求有能判断栈满，栈空的能力，能填充元素，取出元素
template <class T,int capacity=10>
class Stack{
public:
    Stack()
    :_index(-1)
    ,_data(new T[capacity]())
    {
    }
    ~Stack(){
        if(_data){
            delete [] _data;
            _data=nullptr;
        }
    }

    bool empty()const;
    bool full()const;
    void push(const T& data);
    void pop();
    T top();
//private:
    int _index;
    T * _data;
};
template <class T,int capacity>
bool Stack<T,capacity>::empty()const{
    return _index==-1;
}
template <class T,int capacity>
bool Stack<T,capacity>::full()const{
    return _index==9;
}
template <class T,int capacity>
void Stack<T,capacity>::push(const T& data){
    _data[_index++]=data;
}
template <class T,int capacity>
void Stack<T,capacity>::pop(){
    --_index;
}
template<class T,int capacity>
T Stack<T,capacity>::top(){
    return _data[--_index];

}
void test(){
    Stack<int> S;
    for(int i=0;i<10;i++){
        S.push(i);
    }
    cout<<S.full()<<endl;
    for(int i=0;i<10;i++){
        cout<<S.top()<<endl;
    }
   cout<< S.empty()<<endl;
}
int main(int argc, char * argv[]){
    test();
    return 0;
}

